//app.js
App({
  sHttp: null,
  // 手机型号，
  mobileModel:'',
  // 手机系统版本号,
  mobileSystem:'',
  // 版本号
  version:'',
  IronVersion:'1.3.0',
  // 用户Token
  userToken: null,
  userTokenTimestamp: 0,
  // 用户当前的注册状态。
  accountStatus: 1, //0未注册、1审核中、2审核通过、3审核未通过
  requestNumber: -1,

  onLaunch: function() {
    this.appIsUpdate();
    this.InitInfoMsg();

  },
  // 检查更新
  appIsUpdate: function () {
    //检查是否存在新版本
    wx.getUpdateManager().onCheckForUpdate(function (res) {
      // 请求完新版本信息的回调
      if (res.hasUpdate) { //如果有新版本
        // 小程序有新版本，会主动触发下载操作（无需开发者触发）
        wx.getUpdateManager().onUpdateReady(function () { //当新版本下载完成，会进行回调
          wx.showModal({
            title: '更新提示',
            content: '新版本已经准备好，单击确定重启应用',
            showCancel: false,
            success: function (res) {
              if (res.confirm) {
                // 新的版本已经下载好，调用 applyUpdate 应用新版本并重启
                wx.getUpdateManager().applyUpdate();
              }
            }
          })
        })
        // 小程序有新版本，会主动触发下载操作（无需开发者触发）
        wx.getUpdateManager().onUpdateFailed(function () { //当新版本下载失败，会进行回调
          wx.showModal({
            title: '提示',
            content: '检查到有新版本，但下载失败，请检查网络设置',
            showCancel: false,
          })
        })
      }
    });
  },
  InitInfoMsg(){
    // 初始化设备信息。
     wx.getSystemInfo({
      success: e => {
        // 是否为全面屏
        this.globalData.screenHeight = e.screenHeight
        this.mobileModel = e.model;
        this.mobileSystem = e.system;
        this.version = wx.getAccountInfoSync().miniProgram.version;
        this.globalData.windowHeight = e.windowHeight;
        this.globalData.StatusBar = e.statusBarHeight;
        let capsule = wx.getMenuButtonBoundingClientRect();
        if (capsule) {
         	this.globalData.Custom = capsule;
        	this.globalData.CustomBar = capsule.bottom + capsule.top - e.statusBarHeight;
        } else {
        	this.globalData.CustomBar = e.statusBarHeight + 50;
        };
        // 初始化 HTTP对象。
        this.sHttp == null?this.sHttp = require('/http/http.js').API:'';
      }
    })
  },
  reloadUserInfo(){
    this.userTokenTimestamp = 0;
    this.userToken = null;
    this.globalData.userInfo = null;
    wx.removeStorageSync('_userToken');
  },
  // 检查Token是否过期 或者不存在 并回复一个合法Token
  // 做一个缓存。用来防止用户Token //token有效期为 120分钟。设置缓存时长为 100分钟\
  async checkToken(){
    // console.log('被检查-----------');
    let howMinute = (((Date.parse(new Date())) - this.userTokenTimestamp) / 1000) / 60;
    // 检查是否过期
    if(howMinute > 100){
      // 过期了 检查缓存里面是否有缓存的Token
      if('' == wx.getStorageSync('_userToken')){
        // 缓存里也没有。
        return await this.userLogin();
      }else{
        // 检查缓存里面的时效性。
        let userTokns = JSON.parse(wx.getStorageSync('_userToken'));
        let minute = (((Date.parse(new Date())) - userTokns.timestamp) / 1000) / 60;
        if(minute > 100){
          wx.removeStorageSync('_userToken');
          // 失效。请求。
          return await this.userLogin();
        }else{
          this.userToken = userTokns.userToken;
          this.userTokenTimestamp = userTokns.timestamp;
          this.accountStatus = userTokns.accountStatus;
          return this.userToken;
        }
      }
    }else{
      return this.userToken;
    }

  },
  // 用户登录
  async userLogin(){
    const asyncLogin = this.promisify(wx.login);
    const res = await asyncLogin();
    let _this = this;
    return await new Promise(function(resolve, reject){
      _this.sHttp.userLogin(res.code)
        .then(res => {
            //请求成功 保存到Storage
            let userTokns = {'userToken':res.result.token,'accountStatus':res.result.accountStatus,'userTokenTimestamp':Date.parse(new Date())};
            // res.result.accountStatus = 0;
            // userTokns.accountStatus = 0;
            _this.userToken = userTokns.userToken;
            _this.accountStatus = userTokns.accountStatus;
            _this.userTokenTimestamp = userTokns.userTokenTimestamp;
            if(2 == userTokns.accountStatus){
              // 默认一个头像。
              if (undefined == res.result.userLogoUrl || null == res.result.userLogoUrl || '' == res.result.userLogoUrl) {
                res.result.userLogoUrl = 'https://zzsourcecar.oss-cn-hangzhou.aliyuncs.com/dealer/user/logo/220226/48319087caa342f6a922e1eb56ad197ao.png?Expires=3227008508&OSSAccessKeyId=LTAI4GBcZtMnrVQ72WG22fri&Signature=m8PNNh3q0t%2BKJ0bPxrLvWUmBBME%3D';
              }
              // 在这里给手机号分段吧。页面wxs分段有渲染问题。
              if (undefined != res.result.userMobile && null != res.result.userMobile && '' != res.result.userMobile) {
                let Mobile = res.result.userMobile;
                res.result.userMobile = Mobile.substring(0, 3) + ' ' + Mobile.substring(3, 7)+ ' ' + Mobile.substring(7, 11);
              }
            }
            _this.globalData.userInfo = res.result;
            // wx.setStorageSync('_userToken', JSON.stringify(userTokns));
            resolve(userTokns.userToken);
        })
        .catch(err => {
          resolve('error');
        })
    });
  },
  // 全局Loading默认
  showLoading(title){
    // wx.showLoading({
    //   title: undefined == title?'加载中':title,
    //   mask: true //默认蒙层。防止触摸穿透
    // })
  },
  // 全局提示文字。
  alert(title){
    // wx.showToast({
    //   title: title,
    //   icon: 'none',
    //   duration: 2000
    // })
  },
  success(title){
    // wx.showToast({
    //   title: title,
    //   icon: 'success',
    //   duration: 2000
    // })
  },
  error(title){
    // wx.showToast({
    //   title: '提示：' + title,
    //   icon: 'none',
    //   duration: 3000
    // })
  },
  // 深拷贝
  deepCopy(obj) {
    var cache = [];
    if (obj === null || typeof obj !== 'object') {
        return obj
    }
    const hit = cache.filter(c => c.original === obj)[0]
    if (hit) {
        return hit.copy
    }
    const copy = Array.isArray(obj) ?  [] :   {}
    cache.push({
        original: obj,
        copy
    })
    Object.keys(obj).forEach(key => {
        copy[key] = this.deepCopy(obj[key], cache)
    })
    return copy
  },
  // 微信 wx.abcd 非异步处理
  promisify(fn) {
    // promisify() 返回的是一个函数，
    // 这个函数跟传入的 fn（即 wx.abcd） 签名相同（或兼容）
    return async function(args) {
    //^^^^ 接受一个单一参数对象
        return new Promise((resolve, reject) => {
    //^^^^^^^^^^^ 返回一个 Promise 对象
            fn({
    //^^ ^ 调用原函数并使用改造过的新的参数对象
                ...(args || {}),
    //^^^^^^^^ 这个新参数对象得有原本传入的参数，
    //^^  当然得兼容没有传入参数的情况
                success: res => resolve(res),
    //^^^^^^^^^^^^^^^^^^^^^^^^^^^^  注入 success 回调，resovle 它
                fail: err => reject(err)
    //^^^^^^^^^^^^^^^^^^^^^^^^ 注入 fail 回调，reject 它
            });
        });
    };
  },
  formatTime(date){
    const formatNumber = n => {
      n = n.toString()
      return n[1] ? n : '0' + n
    }
    const year = date.getFullYear()
    const month = date.getMonth() + 1
    const day = date.getDate()
    const hour = date.getHours()
    const minute = date.getMinutes()
    const second = date.getSeconds()
    return [year, month, day].map(formatNumber).join('-') + ' ' + [hour, minute].map(formatNumber).join(':')
  },
  // 存在未知参数,或授权问题
  showNoAuthOrNoGrant(content){
    let self = this;
    wx.showModal({
      title: '提醒',
      content: content,
      confirmText: '我知道啦',
      showCancel: false,
      success(res) {
        // 跳转到start
        self.BackPage();
      }
    })
  },
  BackPage() {
    var that = this;
    wx.navigateBack({
        delta: 1,
        fail: function () {
            that.toHome();
        }
    });
  },
  toHome() {
    wx.reLaunch({
        url: '/pages/home/home',
    })
  },
  showLoginInvalid(){
    let self = this;
    wx.showModal({
      title: '登录过期',
      content: '您当前登录信息失效了，请点击重新登录',
      confirmText: '重新登录',
      showCancel: false,
      success(res) {
        self.userLogin();
      }
    })
  },
  /**
   * GetQueryString   二维码参数转换提取
   * 参数
   * url      二维码参数
   * name     需要提取的参数
   */
  GetQueryString(url, name) {
    let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
    let r = `&${url}`.match(reg);
    if (r != null) return decodeURI(r[2]);
    return null;
  },
  // 时间差 29秒 重新加载。
  needReload(end_date) {
    if(null == end_date || undefined == end_date || '' == end_date){
      return false
    }
    var start_date = new Date();
    var days = end_date.getTime()/1000 - start_date.getTime()/1000;
    return Number(days).toFixed(0) < -120;
  },
  // 打开客服对话
  openCustomerServiceChat(){
    wx.openCustomerServiceChat({
      extInfo: {url: 'https://work.weixin.qq.com/kfid/kfc4f6e0d75b5eb526c'},
      corpId: 'ww777f57cc869110bb',
      success(res) {
        console.log('客服调用成功');
      },
      fail(err){
        console.log('error',err);
      }
    })
  },
  globalData: {
    lookReportInfoUrl:'', //报告URL
    subReportOrderData:null, //提交查维保订单所需要的全部参数信息。
    scopeRowReport: null, //选择的报表参数。
    scopeRowCar:null, // 选择车库车辆查询 的默认参数
    reloadWantBuy: false,  // 是否重载求购页面
    failModal: true,
    shareUserId:null, //通过分享方式进入，会有一个分享人的ID
    userInfo: null, //用户的基本信息。
    carBrandList:null, //为请求做个缓存。车辆品牌索引列表
    defaultCity: '全国', // 默认为全国，无省份，为城市名称
    defaultCounty: '', //本次不做区县
    screenHeight: 0, //是否为全面屏
    atttionCar:null,
    customerService:'18667180007',
    // 以下是做持久化时间用。
    homeComponentLoadTime:null,
    wantBuyComponentLoadTime:null,
    garageComponentLoadTime:null,
    meComponentLoadTime:null,
    manageComponentLoadTime:null,
    dealerRegion:['请选择位置信息','',''],
    dealerInfo:{},
    priceList:[], // 可用的充值列表
    ScopeUser:null,
    shipin:[],
    tupian:[],
    baogao:[],
    windowHeight: 0
  }
})